package com.app.actions;

import com.app.model.User;
import com.app.utils.Pager;
import com.opensymphony.xwork2.ActionSupport;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

public class BaseAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    /**
     * 每个菜单的唯一标识
     */
    private String sort;


    protected Pager pager = new Pager();


    public Pager getPager() {
        return pager;
    }

    public void setPager(Pager pager) {
        this.pager = pager;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }

    /**
     * 获得HttpServletRequest对象
     *
     * @return HttpServletRequest
     */
    protected HttpServletRequest getRequest() {
        return ServletActionContext.getRequest();
    }

    /**
     * 获得HttpServletResponse对象
     *
     * @return HttpServletResponse
     */
    protected HttpServletResponse getResponse() {
        return ServletActionContext.getResponse();
    }

    /**
     * 获得HttpSession对象
     *
     * @param flag 如果当前session不存在是否重新创建session
     * @return HttpSession
     */
    protected HttpSession getSession(boolean flag) {
        return this.getRequest().getSession(flag);
    }

    /**
     * 获得response输出对象
     *
     * @return PrintWriter
     * @throws IOException
     */
    protected PrintWriter getOut() throws IOException {
        HttpServletResponse response = this.getResponse();
        return response.getWriter();
    }

    /**
     * 使用response输出流输出信息
     *
     * @return PrintWriter
     * @throws IOException
     */
    protected void print(String info) throws IOException {
        HttpServletResponse response = this.getResponse();
        response.getWriter().print(info);
    }

    protected Enumeration<?> getParameterNames() {
        return this.getRequest().getParameterNames();

    }

    /**
     * 获取参数值（字符串）
     *
     * @param parameterName 要获取参数的名称
     * @return 参数的值
     */
    protected String getParameterForString(String parameterName) {
        return this.getRequest().getParameter(parameterName);
    }

    /**
     * 获取参数值（长整型）
     *
     * @param parameterName 要获取参数的名称
     * @return 参数的值
     */
    protected long getParameterForLong(String parameterName) throws NumberFormatException {
        if (this.getRequest().getParameter(parameterName) == null || this.getRequest().getParameter(parameterName) == "") {
            return 0;
        }
        return Long.parseLong(this.getRequest().getParameter(parameterName));
    }

    /**
     * 获取参数值（整型）
     *
     * @param parameterName 要获取参数的名称
     * @return 参数的值
     */
    protected int getParameterForInt(String parameterName) throws NumberFormatException {
        if (this.getRequest().getParameter(parameterName) == null || this.getRequest().getParameter(parameterName) == "") {
            return 0;
        }
        return Integer.parseInt(this.getRequest().getParameter(parameterName));
    }

    /**
     * 获取参数值(字符串数组)
     *
     * @param parameterName 要获取参数的名称
     * @return 参数的值
     */
    protected String[] getParameterValues(String parameterName) throws Exception {
        return this.getRequest().getParameterValues(parameterName);
    }

    protected Map<?, ?> getParameterMap() throws Exception {
        return this.getRequest().getParameterMap();
    }

    /**
     * 往request里面设置值
     *
     * @param key 要设置的关键字
     * @param obj 要设置的值
     */
    protected void setAttribute(String key, Object obj) {
        this.getRequest().setAttribute(key, obj);
    }

    /**
     * 获得session的值
     *
     * @param <T>      泛型
     * @param attrName
     * @param clazz
     * @return
     */
    @SuppressWarnings("unchecked")
    protected <T> T getSessionAttr(String attrName, Class<T> clazz) {
        return (T) this.getSession(false).getAttribute(attrName);
    }

    /**
     * 往session里面设置值
     *
     * @param attrName 关键字
     * @param obj      设置的值
     */
    protected void setSessionAttr(String attrName, Object obj) {
        this.getSession(false).setAttribute(attrName, obj);
    }

    /**
     * 　　 * 获取当前会话的登录用户信息 这个重要！！！！
     * 　　 * @return User
     */
    public User getSessionLoginedUser() {
        User currentUser = (User) this.getSession(true).getAttribute("loginedUser");
        return currentUser;
    }


    /**
     * 输出josn
     *
     * @param object
     */
    public void out(JSONObject object) {
        javax.servlet.http.HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setCharacterEncoding("utf-8");
        try {
            PrintWriter out = response.getWriter();
            out.print(object);
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    /**
     * json的帮助方法
     *
     * @param msg      需要返回的消息文本
     * @param navTabId 需要刷新的面板id
     */
    public void JsonOut(String msg, String navTabId) {
        JSONObject object = new JSONObject();


        object.put("statusCode", "200");
        object.put("message", msg);
        object.put("navTabId", navTabId);
        object.put("rel", "");
        object.put("callbackType", "closeCurrent");        /* "callbackType":"closeCurrent",*/
        object.put("forwardUrl", "");
        out(object);
    }

    /**
     * json的帮助方法
     *
     * @param msg 需要返回的消息文本
     */
    public void JsonOut(String msg) {
        Map<String, String> map = (Map<String, String>) getRequest().getSession().getServletContext().getAttribute("userSort");
        if (map != null) {
            String navTabId = map.get(this.sort);
            System.out.println("****************************************************************************************\n" + navTabId);
            JsonOut(msg, navTabId);
        } else {
            JsonOut(msg, getSort());
        }
    }
}